package base

import "jvm/nzpJvm/runtime_area"

// 所有指令的抽象接口
type Instruction interface {
	// 拉取操作数。用于从方法的code属性中读取操作数
	FetchOperands(reader *BytecodeReader)
	// 执行此指令的行为
	Execute(frame *runtime_area.Frame)
}

// 不需要拉取操作数的指令的公共父类
type NoOperandsInstruction struct {

}

func (self *NoOperandsInstruction)FetchOperands(reader *BytecodeReader)  {
// 不需要从字节码中获取操作数
}




// 从字节码中拉取一个int16的有符号整数作为下一个指令的偏移量的指令的公共父类。用来实现跳转指令，例如goto，if_cmp
type BranchInstruction struct {
	Offset int
}

// 获取操作数，对于此类型来说，是偏移量
func (self *BranchInstruction)FetchOperands(reader *BytecodeReader)  {
	self.Offset = int(reader.ReadInt16())
}




// 需要从字节码中获取所操作的本地变量表索引的公共结构体。例如istore，iload指令
type Index8Instruction struct {
	Index uint
}

func (self *Index8Instruction)FetchOperands(reader *BytecodeReader)  {
	self.Index = uint(reader.ReadUint8())
}


// 需要从字节码中获取所操作的常量池索引的公共结构体。例如ldc指令
type Index16Instruction struct {
	Index uint
}

func (self *Index16Instruction)FetchOperands(reader *BytecodeReader)  {
	// 获取两个字节，并且组合成一个无符号整数作为操作数
	self.Index = uint(reader.ReadUint16())
}

